﻿#pragma once
#include <iostream>
#include <vtkm/Matrix.h>
#include <vtkm/cont/Algorithm.h>
#include <vtkm/cont/ArrayHandle.h>        //数组类的头文件 头文件是路径
#include <vtkm/worklet/WorkletMapField.h> //算子封装头文件

struct SMatrix : vtkm::worklet::WorkletMapField
{

  using ControlSignature = void(FieldOut& B, FieldOut& C, FieldOut& D); //FieldIn& A) ,行矩阵，列矩阵，非0元素矩阵
  using ExecutionSignature = void(_1, _2, _3); //用于定义输入矩阵和输出的三个向量组 _1,

  int _N, _M,_n,_m,_L; //稀疏矩阵总行数N、列数M，行下标n，列下标m，总有效元素个数L;
  SMatrix(const int& N, const int& M, int& n, int& m, int& L): _N(N) , _M(M) , _n(n) , _m(m) , _L(L){} 


  template<typename FieldType>
  void operator()(const FieldType& B, FieldType& C,const FieldType& D) const 
  {
    //typedef struct
    //{
    //  vtkm::cont::ArrayHandle<FloatDefault> x;
    //  x.Allocate(10);
    //  fill(x, 1);

    //}ArrayB;

    L = 0;
    for (int i = 0, i < N, i++)
    {
      for (int j = 0, j < M, i++)
      {
        if (A[i][j] != 0)
        {
          n = i, m = j;
          vtkm::cont::Algorithm::Fill(B, L, n);
          vtkm::cont::Algorithm::Fill(C, L, m);
          vtkm::cont::Algorithm::Fill(D, L, A[i][j]);
          L++;
        }
      }
    }    
  }

};

// 引入稀疏矩阵
  template<typename int>
  void SparseMatrix(const int& N, const int& M)
  {
    vtkm::Matrix<int, N, M> A;

  }

  //稀疏矩阵分组
  template<typename ArrayType> 
  void mxpy(const ArrayType& B, ArrayType& C, ArrayType& D, const int& N, const int& M, int& n, int& m, int& L)
  {
    vtkm::cont::Invoker{}(Mxpy{ N, M, n, m, L }, B, C, D);
  }























 
